>> ultrafil >> Tutoriaux Pogrammation 3d >> Architecture d'objets simples
Infos Logiciels Jeux écrans de veille Fonds d'écran OpenGL Prog 3D Liens
- Architecture d'objets simples -
Nous allons étudier ici la manière de concevoir, de modéliser et de construire des objets simples. Du cube à la sphere (cylindre, disque, donut..) nous verrons que nous pouvons regrouper nos objets, suivant des modèls de constructions.

Commençons par définir une interface, la plus générale possible, que nous pourrons utiliser pour obtenir un comportement polymorphique de nos objets, fort pratique. Cette interface doit prévoir les méthodes que nous utiliseront plus tard pour positionner, tourner, animer.. nos objets 3D.

L'avantage d'avoir des objets ayant un comportement polymorphique tien dans le fait qu'il suffit de créer un tableau dynamique de pointeurs, ou de références, de la classe de base (notre interface) pour pouvoir stocker tous nos objets, que se soit des cubes, des sphères, qu'il soit d'un type A ou d'un type B.

Dans la source disponible avec ce tutorial, j'ai défini une classe abstraite shape (uf3d.h) qui sera notre interface sur laquel nous allons dérivé tous nos objets. J'ai ensuite dérivé cette classe en shape3d, qui nous permet de définir la structure de nos futurs objets. Ils seront composés d'une couleur, de vertex, de normales et d'un mapping. J'ai ensuite dérivé la classe cube de shape3d, qui s'affichera donc comme un cube le plus basic qui soit. Nous pouvons dériver autant de classes que l'on veut pour définir des objets simples de la classe shape3d.

Mais nous pouvons également créer des objets un peut farfelus, j'ai donc créé une classe shape3dK (K comme kaelidoscope, allez savoir!), dérivé de shape sur laquel je vais définir, pour chaque vertex une couleur. J'ai dérivé cette classe en cubeK, et nous pourrions bien sur faire des sphereK, des cylindreK qui auraient la même propriété 'farfelue'.
Diagramme des classes - niveau 0
Vue générale de l'application.
Détails du diagramme
Je vous présente la structure générale des sources de ce tutorial afin que vous comprenniez mieux où se trouvent les algorithmes intéressants.
Donc la classe COpenGL ouvre une fenetre. Afin de ne pas alourdir nos fichiers .cpp, il est préférable de la dérivé en CDemo, où nous allons pouvoir nous concentrer sur notre scène 3D.
Dans CDemo nous définissons un tableau dynamic de shape*. Ainsi dans la phase d'initialisation de CDemo nous remplissons notre tableau de tous les objets que l'on veut. Et dans la phase de libération de la mémoire nous détruisons tous les objets qui se trouvent dans ce tableau. Cet 'astuce' permet d'optimiser le nombre de lignes à écrire pour le programmeur, tout en assurant de libérer la mémoire quel que soit les objets que l'on rajoute au fur et à mesure dans ce tableau.
Diagramme des classes - niveau 1
Vue de l'organisation hierarchique des classes d'objets 3D.
Détails du diagramme
Comme vous le voyez, shape est la base de tous nos objets 3D. On la dérive en une classe abstraite, elle aussi, qui va définir plus précisement la structure interne des objets. Par exemple les objets construient sur shape3d ont une couleur diffuse et une liste de vertex avec pour chaque vertex une normale et un mapping définit.
Les objets qui seront dérivés de shape3dK eux auront une liste de vertex avec pour chaque vertex une normale, un mapping et une couleur que l'on pourra définir comme bon nous semble.
Diagramme des classes - niveau 2
Spécification du contenu des classe body et bodyK.
Détails du diagramme
Ce diagramme montre comment sont construites les classes internes de nos objets. bodyK ayant les mêmes attributs que body, elle est construite dessus, et on y a ajouté une couleur qui correspond à la couleur du vertex associé.
Voilà ce que ca donne
ScreenShot du rendu de la source de ce tutorial.
Les espaces de noms
Avant de conclure j'aimerai vous expliquer l'importance que les espaces de noms apportent dans le cadre d'une 'bonne' programmation. Les espaces de noms permettent de résoudre les problèmes de conflit lors de la compilation. Ils permettent également de regrouper par 'thème' les différentes classes que vous construisez. Pour ces deux raisons, vous remarquerez que j'ai regroupé toutes les classes de la couche 3D 'bas niveau' dans l'espace de nom uf3d et toutes les nouvelles classes de ce tutorial sont regroupées dans l'espace de nom ufgl. La distinction entre ces deux espaces est une bonne chose car dans uf3d les classes sont génériques, elles ne s'appuient sur aucune bibliothéques graphique. Alors que les classes appartenant à ufgl encapsule OpenGL, dès lors nous pourrions construire un espace de nom ufdx (par exemple, mettez le nom que vous voulez, ici c'est pour rester cohérent dans ma pédagogie ;) ) qui reprendrait les mêmes classes que dans ufgl mais qui encapsulerait DirectX. Grâce à ce principe il est facile ensuite de passer d'une bibliothèque graphique à une autre sans changer l'architecture de votre application (et surtout avec un minimum de code)
Conclusion
Ce tutorial vous a expliqué comment concevoir de simples objets 3D. Les sources disponibles vous montrent comment les construire.

Vous pouvez utiliser cette technique pour charger des objets aux formats de modeleurs, comme 3ds, maya..

Dans le prochain tutorial nous verrons comment assembler plusieur objets simples dans le but de construire un personnage qui pourra courir, taper et attraper des objets, le parfait petit quakeliker :p
Télécharger les sources
Ces sources génerent aléatoirement trois cubes, sphères ou cylindres et les affichent en mode normal et en mode filaire. L'objet du milieu dérive de shape3dK alors que les deux autres dérivent de shape3d.

Autre chose, dans certain cas le corp des fonctions est défini dans la définition de la classe et d'autres fois à l'exterieur. J'ai en fait essayé de faire en sorte que le code soit le plus lisible possible pour vous. En général les petites fonctions sont dans la classe alors que les grosses qui demandent des commentaires en francais sont en dehors.

Retour